接續前一天的內容,再來看看書上有提到的一些關於物件初始化的內容。
初始化的順序規則如下:
然而還有最後一點:non-local static物件的初始化順序是在別的translation units*被定義的!*
這看起來很複雜,可以拆解來看:
首先static物件的life cycle是從他被創立,直到整個程式結束。non-local指不是在function內的static object。
而translation unit則差不多相當於"single object file"。
不同的translation unit的初始化順序是不一定的!
我們可以確定同一translation unit內的順序,但沒有辦法確定在不同translation unit的物件他們的綜合順序,
所以最直接的方式就是以 local static 物件來取代 non-local static 物件。
但這也有其他需要注意的事項。有不同的設計方始來避免他,這個後續再做補充。
總結這段內容,要符合這個守則,有三件事要做:
貼心重點提醒:
- Manually initialize obejcts of built-in type, because C++ only sometimes initializes them itself
built-in type也初始化一下它的數值,免得出現不預期行為!- In a constructor, prefer use of the member initialization list to assigment inside the body of the constructor. List data members in the initialization list in the same order they're declared in the class.
- Avoid initialzation order problems across translation units by replcaing non-local static objects with local static objects.